package Logica;

import Persistencia.*;
import Datatypes.*;
import Interfaces.*;
import JBeans.ArbolComentariosBean;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import javax.jws.WebService;
import Datatypes.Base64;
import java.text.DecimalFormat;
import java.util.GregorianCalendar;

@WebService(portName = "TPlayMarketWebPort", serviceName = "TPlayMarketWebService", endpointInterface = "Interfaces.IWeb")
public class ServidorCentral implements IPerfil, IJuego, IComentario, IVersion, IWeb{

    private BDMConexion bdmcon = null;
    private BDMPerfil bdmp = null;
    private BDMJuego bdmj = null;
    private BDMComentario bdmc = null;        
    private BDMVersion bdmv = null;
    private FileManager FLMServidor = null;
    private FileManager FLMGUI = null;
    
    
    public ServidorCentral(String direccionBD) throws Exception{
        //Creacion del servidor

        this.bdmcon = BDMConexion.getInstance(direccionBD);
        this.bdmp = BDMPerfil.getInstance();
        this.bdmp.setConexion(this.bdmcon);
        this.bdmj = BDMJuego.getInstance();
        this.bdmj.setConexion(this.bdmcon);
        this.bdmc = BDMComentario.getInstance();
        this.bdmc.setConexion(this.bdmcon);
        this.bdmv = BDMVersion.getInstance();
        this.bdmv.setConexion(this.bdmcon);
        this.FLMServidor = new FileManager(System.getProperty("user.dir"));
        String[] dirServidor = direccionBD.split("/Data");
        this.FLMGUI = new FileManager(dirServidor[0]);

    }

    //SOLO OPERACIONES DE LAS INTERFACES
    //AREA DE TRABAJO DE JONATHAN/////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    @Override
    public List<Integer> totalPuntajesJuego(String nomJuego) throws Exception {
    
        List<Integer> listaPuntajes = new ArrayList();
        
        List<DataPuntaje> puntajesJuego = getPuntajesJuego(nomJuego);
        Iterator<DataPuntaje> itPuntaje = puntajesJuego.iterator();
        
        Integer star1, star2, star3, star4, star5;
        
        star1 = star2 = star3 = star4 = star5 = 0;
                        
        while(itPuntaje.hasNext()){
        
            DataPuntaje dp = itPuntaje.next();
            
            switch(dp.getPuntaje()){
            
                case 1:
                    star1++;
                    break;
                    
                case 2:
                    star2++;
                    break;
                    
                case 3:
                    star3++;
                    break;
                    
                case 4:
                    star4++;
                    break;
                    
                case 5:
                    star5++;
                    break;
            
            }
        
        }
        
        listaPuntajes.add(star1);
        listaPuntajes.add(star2);
        listaPuntajes.add(star3);
        listaPuntajes.add(star4);
        listaPuntajes.add(star5);
        
        return listaPuntajes;
        
    } 
    
    @Override
    public void ingresarPuntaje(DataPuntaje puntaje) throws Exception {
    
        try{
        
            bdmcon.abrirConexion("public void ingresarPuntajes(DataPuntaje puntaje) throws Exception");
            
            Puntaje p = new Puntaje();
            p.setPuntaje(puntaje.getPuntaje());
            p.setNomJuego(puntaje.getNomJuego());
            p.setNickCliente(puntaje.getNickCliente());
            
            bdmc.ingresarPuntaje(p);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
                    
        }
    
    }
    
    @Override
    public List<DataPuntaje> getPuntajesJuego(String nomJuego) throws Exception {
    
        List<DataPuntaje> lista = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataPuntaje> getPuntajesJuego(Integer codJuego) throws Exception");   
        
            List<Puntaje> listap = bdmc.getPuntajesJuego(nomJuego);
            Iterator<Puntaje> itp = listap.iterator();

            while(itp.hasNext()){

                lista.add(itp.next().getData());

            }
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
                    
        }
            
        return lista;
        
    }
    
    @Override
    public List<DataPuntaje> getPuntajesCliente(String nickCliente) throws Exception {
    
        List<DataPuntaje> lista = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataPuntaje> getPuntajesCliente(String nickCliente) throws Exception");   
        
            List<Puntaje> listap = bdmc.getPuntajesCliente(nickCliente);
            Iterator<Puntaje> itp = listap.iterator();

            while(itp.hasNext()){

                lista.add(itp.next().getData());

            }
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
                    
        }
            
        return lista;
        
    }
    
    @Override
    public ArbolComentariosBean getArbolBean(String nombreJuego) throws Exception{
                    
        ArbolComentariosBean acb = new ArbolComentariosBean();
        
        DataJuego dj = elegirJuego(nombreJuego);
        List<DataComentario> comentarios = listarComentarios(nombreJuego);
        List<DataPerfil> perfiles = new ArrayList();

        Iterator<DataComentario> itc = comentarios.iterator();

        while(itc.hasNext()){

            DataComentario dc = itc.next();
            DataPerfil dp = obtenerPerfil(dc.getCliente(), true);
            perfiles.add(dp);

        }

        ArbolComentarios ac = new ArbolComentarios();
        ac.prepareData(comentarios);

        IPerfil ip = this;

        String arbolHTML = ac.listarArbolHTML(ip, false);

        acb.setArbolHTML(arbolHTML);
        acb.setComentarios(comentarios);
        acb.setClientes(perfiles);
        acb.setJuego(dj);
                
        return acb;
    
    }
    
    @Override
    public Boolean esVaciaBD() throws Exception{
                    
        Boolean esVacia = null;
        
        try{
            
            bdmcon.abrirConexion("public Boolean esVaciaBD() throws Exception");
            
            esVacia = this.bdmcon.esVacia();
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
                    
        }
        
        return esVacia;
        
    }
    
    @Override 
    public List<String> getNicks() throws Exception {
    
        List<String> listaNicks = null;
        
        try{
        
            bdmcon.abrirConexion("public List<String> getNicks() throws Exception");
            
            listaNicks = bdmp.getNicks();
            
        }
    
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return listaNicks;
        
    }

    @Override
    public List<String> getEmails() throws Exception {
    
        List<String> listaEmails = null;
        
        try{
        
            bdmcon.abrirConexion("public List<String> getEmails() throws Exception");
            
            listaEmails = bdmp.getEmails();
                    
        }
    
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return listaEmails;
        
    }    
    
    @Override
    public DataPerfil obtenerPerfilXEmail(String email, Boolean cargarImagen) throws Exception{
    
        DataPerfil dp = null;
        
        try{
        
            bdmcon.abrirConexion("public DataPerfil obtenerPerfilXEmail(String email) throws Exception");
            
            Perfil p = bdmp.buscarPerfilXEmail(email);
            
            if(p instanceof Cliente){

                Cliente c = (Cliente)p;

                dp = new DataPerfil(c.getPassWord(), c.getNick(), c.getEmail(), "[CLIENTE]", c.getNombre(), c.getApellido(), c.getFNac(), c.getEdad(), c.getImagen(), null);

            }

            else{

                Desarrollador d = (Desarrollador)p;

                dp = new DataPerfil(d.getPassWord(), d.getNick(), d.getEmail(), "[DESARROLLADOR]", d.getNombre(), d.getApellido(), d.getFNac(), d.getEdad(), d.getImagen(), d.getWebLink());

            }
                               
            if(cargarImagen){
            
                File imagen = new File(System.getProperty("user.dir") + File.separatorChar + dp.getImagen());
                Archivo a = new Archivo(imagen);
                dp.setIMG(Base64.encodeBytes(a.toBytes()));
                            
            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
     
        return dp;
        
    }
    
    @Override
    public Boolean comprobarPassword(String email, String password) throws Exception{
                    
        Boolean valido;
        
        if((email != null) && (password != null)){
        
            try{
                
                bdmcon.abrirConexion("public Boolean comprobarPassword(String email, String password) throws Exception");
                
                valido = bdmp.comprobarPassword(email, password);
                            
            }
            
            catch(Exception e){
            
                throw e;
            
            }
            
            finally{
            
                bdmcon.cerrarConexion();
            
            }
                
        }
        
        else{
        
            throw new Exception("ERROR: Los parametros no pueden ser nulos.");
        
        }
                    
        return valido;
    
    }
        
    @Override
    public void cargarDatosDePrueba(Boolean force) throws Exception { //Carga los datos de prueba.
        
        try{
        
            bdmcon.abrirConexion("public void cargarDatosDePrueba(Boolean force) throws Exception");

            DatosDePrueba dp = DatosDePrueba.getInstance();

            if ((bdmcon.esVacia()) || (force == true)) {

                if(force == true){

                    bdmcon.limpiarBD();

                }

                bdmcon.cerrarConexion();
                
                List<DataPerfil> ldesarrolladores = dp.getLDataPefilesDesarrolladoresDePrueba();
                Iterator<DataPerfil> it = ldesarrolladores.iterator();

                while (it.hasNext()) {

                    DataPerfil perfil = it.next();

                    if (comprobarUsuario(perfil.getNick(), perfil.getCorreo())) {

                        darAltaPerfil(perfil);

                    }

                }

                //System.out.println("ALTA DESARROLLADORES COMPLETA"); //CHECKPOINT 1

                List<DataPerfil> lclientes = dp.getLDataPefilesClientesDePrueba();
                it = lclientes.iterator();

                while (it.hasNext()) {

                    DataPerfil perfil = it.next();

                    if (comprobarUsuario(perfil.getNick(), perfil.getCorreo())) {

                        darAltaPerfil(perfil);

                    }

                }

                //System.out.println("ALTA CLIENTES COMPLETA"); //CHECKPOINT 2

                List<String> lcategorias = dp.getLCategoriasDePrueba();
                Iterator<String> itcategorias = lcategorias.iterator();

                while (itcategorias.hasNext()) {

                    ingresarCategoria(itcategorias.next());

                }

                //System.out.println("ALTA CATEGORIAS COMPLETA"); //CHECKPOINT 3

                List<DataJuego> ljuegos = dp.getLDataJuegosDePrueba();
                Iterator<DataJuego> itjuegos = ljuegos.iterator();

                while (itjuegos.hasNext()) {

                    DataJuego dj = itjuegos.next();
                    String nj = dj.getNombre();
                    Integer codigo_juego = altaDeJuego(dj);
                    this.FLMGUI.crearArchivosDePrueba(nj);
                    String path = FLMGUI.crearImagenDePrueba(nj, codigo_juego.toString());
                    insertarImagen(codigo_juego, path);
                    
                }

                //System.out.println("ALTA JUEGOS COMPLETA"); //CHECKPOINT 4

                List<DataCompra> lcompras = dp.getLDataComprasDePrueba();
                Iterator<DataCompra> itcompras = lcompras.iterator();

                while (itcompras.hasNext()) {

                    registrarCompra(itcompras.next());

                }

                //System.out.println("ALTA COMPRAS COMPLETA"); //CHECKPOINT 5

                List<DataComentario> lcomentarios = dp.getLDataComentariosDePrueba();
                Iterator<DataComentario> itcomentarios = lcomentarios.iterator();

                while (itcomentarios.hasNext()) {

                    realizarComentario(itcomentarios.next());

                }

                //System.out.println("ALTA COMENTARIOS COMPLETA"); //CHECKPOINT 6
                /*ALTA DE VERSIONES APROBADAS -> cada una va a pendiente y de ahi a aprobada*/
                cargarVersiones(dp);
                
                cargarBD();

                List<DataPuntaje> lpuntajes = dp.getLDataPuntajesDePrueba();
                Iterator<DataPuntaje> itpuntajes = lpuntajes.iterator();

                while (itpuntajes.hasNext()) {

                    ingresarPuntaje(itpuntajes.next());

                }
                //System.out.println("ALTA PUNTAJES"); //CHECKPOINT 7
                
            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
    }
    
    @Override
    public Boolean comprobarUsuario(String nick, String email) throws Exception {
        
        Boolean continuar = true;

        try {

            bdmcon.abrirConexion("public Boolean comprobarUsuario(String nick, String email) throws Exception");
            
            continuar = bdmp.existePerfil(nick, email);

        } 
        
        catch (Exception e) {

            throw e;

        }

        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return !continuar;

    }

    @Override
    public void darAltaPerfil(DataPerfil dp) throws Exception { //Jonathan CU1

        try {
           
            String password = dp.getPassWord();
            String nick = dp.getNick();
            String nombre = dp.getNombre();
            String apellido = dp.getApellido();
            Integer edad = dp.getEdad();
            PDate fnac = dp.getFechaNac();
            String email = dp.getCorreo();
            String imagen = dp.getImagen();
            String weblink = dp.getSitioWeb();

            bdmcon.abrirConexion("public void darAltaPerfil(DataPerfil dp) throws Exception");
            
            switch (dp.getTipoPerfil()) {

                case "[CLIENTE]":

                    Perfil C = new Cliente(password, nick, nombre, apellido, edad, fnac, email, imagen);
                    bdmp.altaCliente((Cliente) C);
                    
                    if(dp.getIMG() != null){
                    
                        Archivo a = new Archivo();
                        a.guardarImagen(dp.getIMG(), System.getProperty("user.dir") + File.separatorChar + dp.getImagen());
                    
                    }

                    break;

                case "[DESARROLLADOR]":
                    
                    Perfil D = new Desarrollador(password, nick, nombre, apellido, edad, fnac, email, imagen, weblink);
                    bdmp.altaDesarrollador((Desarrollador) D);
                    
                    if(dp.getIMG() != null){
                    
                        Archivo a = new Archivo();
                        a.guardarImagen(dp.getIMG(), System.getProperty("user.dir") + File.separatorChar + dp.getImagen());
                    
                    }
                    
                    break;

            }
            
        } 
        
        catch (Exception e) {

            throw e;

        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

    }

    @Override
    public DataPerfil obtenerPerfil(String nick, Boolean cargarImagen) throws Exception { //Jonathan CU2

        Perfil p;
        DataPerfil dp = null;
        
        try {

            bdmcon.abrirConexion("public DataPerfil obtenerPerfil(String nick) throws Exception");
            
            p = bdmp.buscarPerfil(nick);
            
            if (p != null) {

                if (p instanceof Cliente) {

                    Cliente c = (Cliente) p;
                    dp = new DataPerfil(c.getPassWord(), c.getNick(), c.getEmail(), "[CLIENTE]", c.getNombre(), c.getApellido(), c.getFNac(), c.getEdad(), c.getImagen(), null);

                } else {

                    Desarrollador d = (Desarrollador) p;
                    dp = new DataPerfil(d.getPassWord(), d.getNick(), d.getEmail(), "[DESARROLLADOR]", d.getNombre(), d.getApellido(), d.getFNac(), d.getEdad(), d.getImagen(), d.getWebLink());

                }              
            
                if(cargarImagen){
            
                    String path = System.getProperty("user.dir") + File.separatorChar + dp.getImagen();
                    File imagen = new File(path);
                    
                    Archivo a = new Archivo(imagen);
                    dp.setIMG(Base64.encodeBytes(a.toBytes()));

                }
                
            }
                                                
        } 
        
        catch (Exception e) {

            throw e;

        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

        return dp;

    }

    @Override
    public void modificarPerfil(String oldnick, String oldemail, DataPerfil dp) throws Exception { //Jonathan CU2

        Perfil p;
        
        if (dp.getTipoPerfil().equals("[CLIENTE]")) {

            String password = dp.getPassWord();
            String nick = dp.getNick();
            String nombre = dp.getNombre();
            String apellido = dp.getApellido();
            Integer edad = dp.getEdad();
            PDate fnac = dp.getFechaNac();
            String email = dp.getCorreo();
            String imagen = dp.getImagen();

            p = new Cliente(password, nick, nombre, apellido, edad, fnac, email, imagen);

        } 
        
        else{

            String password = dp.getPassWord();
            String nick = dp.getNick();
            String nombre = dp.getNombre();
            String apellido = dp.getApellido();
            Integer edad = dp.getEdad();
            PDate fnac = dp.getFechaNac();
            String email = dp.getCorreo();
            String imagen = dp.getImagen();
            String weblink = dp.getSitioWeb();

            p = new Desarrollador(password, nick, nombre, apellido, edad, fnac, email, imagen, weblink);

        }

        try {

            bdmcon.abrirConexion("public void modificarPerfil(String oldnick, String oldemail, DataPerfil dp) throws Exception");
            
            bdmp.actualizarPerfil(oldnick, oldemail, p);
            
        } 
        
        catch (Exception e) {

            throw e;

        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

    }

    @Override
    public List<DataComentario> listarComentarios(String juego) throws Exception{

        
        List<DataComentario> ldcomentarios = new ArrayList();

        try{
        
            bdmcon.abrirConexion("public List<DataComentario> listarComentarios(String juego) throws Exception");
            
            Juego j = bdmj.obtenerJuego(juego);
            
            List<Comentario> lcomentarios = j.getComentarios();

            Iterator<Comentario> itcomentarios = lcomentarios.iterator();

            while (itcomentarios.hasNext()) {

                Comentario c = itcomentarios.next();
                DataComentario dc = c.getData();
                ldcomentarios.add(dc);

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

        return ldcomentarios;

    }

    @Override
    public void realizarComentario(DataComentario dc) throws Exception{ //Jonathan CU8

        Comentario c = new Comentario(dc);
        try{
            
            bdmcon.abrirConexion("public void realizarComentario(DataComentario dc) throws Exception");
            
            bdmc.ingresarComentario(c);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

    }

    @Override
    public void responderComentario(DataComentario dc) throws Exception{ //Jonathan CU8

        Comentario r = new Comentario(dc);
        
        try{
            
            bdmcon.abrirConexion("public void responderComentario(DataComentario dc) throws Exception");
            
            bdmc.ingresarComentario(r);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

    }

    //TERMINADA
    @Override
    public List<String> listarNomJuegos() throws Exception{ // Jonathan CU8

        List<String> listaNomJuegos = null;
        
        try{
            
            bdmcon.abrirConexion("public List<String> listarNomJuegos() throws Exception");
            
            listaNomJuegos = bdmj.obtenerListaDeJuegos();
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return listaNomJuegos;

    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //AREA DE TRABAJO DE NACHO//////////////////////////////////////////////////
    //TERMINADA
    
    @Override
    public void altaCategoriaReclamo(DataCategoria dc) throws Exception{
    
        Categoria c = new Categoria(dc.getNombre());
        
        try{
            
            bdmcon.abrirConexion("public void altaCategoriaReclamo(DataCategoria dc) throws Exception");
            
            bdmp.altaCatReclamo(c);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
    
    }
    
    @Override
    public DataCategoria getCategoria(Integer id) throws Exception{
    
        DataCategoria dc = null;
        
        try{
            
            bdmcon.abrirConexion("public void getCategoria(Integer id) throws Exception");
            Categoria c = bdmp.getCategoria(id);
            dc = new DataCategoria(c.getId(), c.getNombre());
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }   
        
        return dc;
    
    }
    
    @Override
    public List<DataCategoria> listarCategoriasReclamos() throws Exception{

        List<DataCategoria> cats = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataCategoria> listarCategoriasReclamos() throws Exception");
            
            List<Categoria> categorias = this.bdmp.listarCategoriasReclamos();
            
            for(Categoria c: categorias){

                DataCategoria dc = new DataCategoria(c.getId(), c.getNombre());
                cats.add(dc);

            }

            if(categorias == null){ return null; }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return cats;        

    }
    
    @Override
    public void altaReclamo(DataReclamo dr) throws Exception{
    
        Reclamo r = new Reclamo(dr);
        
        try{
            
            bdmcon.abrirConexion("public void altaReclamo(DataReclamo dr) throws Exception");
            
            bdmp.altaReclamo(r);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
    
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
    }
    
    @Override
    public List<DataReclamo> verReclamos(Integer cod) throws Exception{
    
        List<DataReclamo> listaR = new ArrayList<>();
        
        try{
            
            bdmcon.abrirConexion("public List<DataReclamo> verReclamos(Integer cod) throws Exception");
            
            List<Reclamo> listaAux = bdmp.listarReclamos(cod);
               
            for(Reclamo r: listaAux){

                DataReclamo dr = r.getData();
                listaR.add(dr);

            }

            if(listaAux.isEmpty()){

                return null;

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return listaR;
    
    }
    
    @Override
    public List<DataCategoria> listarCategorias() throws Exception{ //diego

        List<DataCategoria> cats = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataCategoria> listarCategorias() throws Exception");
            
            List<Categoria> categorias = this.bdmj.listarCategorias();
        
            Iterator<Categoria> it = categorias.listIterator();
            if (!categorias.isEmpty()) {

                while (it.hasNext()) {

                    Categoria c = it.next();
                    DataCategoria dc = new DataCategoria(c.getId(), c.getNombre());
                    cats.add(dc);

                }
            }
            
        }

        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return cats;

    }
    
    @Override
    public List<String> listarPerfiles() throws Exception{

        List<String> lista = new ArrayList();
            
        try{
        
            bdmcon.abrirConexion("public List<String> listarPerfiles() throws Exception");
           
            List<Perfil> listaP = bdmp.listarPerfiles();

            if (!listaP.isEmpty()) {

                Iterator<Perfil> it = listaP.listIterator();
                while (it.hasNext()) {

                    Perfil p = it.next();
                    lista.add(p.getNick());

                }
            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

        return lista;

    }

    //TERMINADA
    @Override
    public DataJuego elegirJuego(String juego) throws Exception{

        DataJuego dj = null;
        
        try{
            
            bdmcon.abrirConexion("public DataJuego elegirJuego(String juego) throws Exception");
            
            Juego j = bdmj.obtenerJuego(juego);
            
            String path = FLMGUI.getProperty() + "/" + j.getImagen();
            String codeImage = this.FLMGUI.obtenerBase64(path);
            dj = new DataJuego(j.getDesarrollador().getNick(), j.getNombre(),
                j.getDescripcion(), j.getSize(), j.getCodigo(), j.getPrecio(), null, j.getImagen(), codeImage);
            List<String> categorias = new ArrayList();
            List<Categoria> cats = j.getCategorias();
            int largo = cats.size();
            for (short i = 0; i < largo; i++) {

                categorias.add(cats.get(i).getNombre());

            }
            dj.setCategorias(categorias);

        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return dj;

    }
    
    //TERMINADA
    @Override
    public DataJuego elegirJuegoXCodigo(Integer codigo) throws Exception{

        DataJuego dj = null;
                
        try{
            
            bdmcon.abrirConexion("public DataJuego elegirJuegoXCodigo(Integer codigo) throws Exception");
            
            Juego j = bdmj.buscarJuegoxCodigo(codigo);
            String path = FLMGUI.getProperty() + "/" + j.getImagen();
            String img64 = this.FLMGUI.obtenerBase64(path);
            dj = new DataJuego(j.getDesarrollador().getNick(), j.getNombre(),
                    j.getDescripcion(), j.getSize(), j.getCodigo(), j.getPrecio(), null, j.getImagen(), img64);
            List<Categoria> cats = this.bdmj.listarCategoriasDeJuego(j.getCodigo());
            List<String> categorias = new ArrayList<>();
            int largo = cats.size();
            for (short i = 0; i < largo; i++) {

                categorias.add(cats.get(i).getNombre());

            }
            dj.setCategorias(categorias);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return dj;

    }

    //TERMINADA
    @Override
    public List<String> listarJuegosXCategoria(String categoria) throws Exception{

        List<String> listaJuegos = null;
        
        try{
        
            bdmcon.abrirConexion("public List<String> listarJuegosXCategoria(String categoria) throws Exception");
            
            listaJuegos = bdmj.listaJuegosXCategoria(categoria);
        
        }

        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
            
        }
        
        return listaJuegos;
        
    }
    
    //TERMINADA
    @Override
    public List<String> listarJuegosXIDCategoria(Integer idCat) throws Exception{

        List<String> listaJ = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<String> listarJuegosXIDCategoria(Integer idCat) throws Exception");
            
            List<String> listaAux = bdmj.listaJuegosXCategoria(idCat);
                
            int largo = listaAux.size();
            for(int i=0; i < largo; i++){

                String[] datosJ = listaAux.get(i).split("-");

                try {

                    if(bdmv.tieneAprobada(Integer.parseInt(datosJ[0]))){

                        listaJ.add(listaAux.get(i));

                    }

                } catch (Exception e) {

                    throw e;

                }

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return listaJ;

    }

    @Override
    public List<DataCategoria> listarCategoriasDeJuego(Integer codigo) throws Exception {

        List<DataCategoria> listaDC = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataCategoria> listarCategoriasDeJuego(Integer codigo) throws Exception");
            
            List<Categoria> listaC = bdmj.listarCategoriasDeJuego(codigo);
            ListIterator<Categoria> it = listaC.listIterator();
            if (!listaC.isEmpty()) {
                while (it.hasNext()) {
                    Categoria c = it.next();
                    DataCategoria dc = new DataCategoria(c.getId(), c.getNombre());
                    listaDC.add(dc);
                }

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return listaDC;

    }

    //TERMINADA
    @Override
    public DataPerfil seleccionarPerfil(String nick, String email)  throws Exception {

        DataPerfil dp = null;
        
        try{
            
            bdmcon.abrirConexion("public DataPerfil seleccionarPerfil(String nick, String email)  throws Exception");
            
            Perfil p = bdmp.elegirPerfil(nick, email);

            if (p instanceof Cliente) {

                Cliente c = (Cliente) p;
                dp = new DataPerfil(c.getNick(), c.getEmail(), "[CLIENTE]",
                        c.getNombre(), c.getApellido(), c.getFNac(), c.getEdad(),
                        c.getImagen(), null);

            } else {

                Desarrollador d = (Desarrollador) p;
                dp = new DataPerfil(d.getNick(), d.getEmail(), "[DESARROLLADOR]",
                        d.getNombre(), d.getApellido(), d.getFNac(), d.getEdad(),
                        d.getImagen(), d.getWebLink());

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

        return dp;

    }

    @Override
    public List<DataPerfil> getClientesCompranJuego(Integer codigo) throws Exception {

        List<DataPerfil> listaDP = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataPerfil> getClientesCompranJuego(Integer codigo) throws Exception");
            
            List<Cliente> listaC = bdmj.getClientesCompranJuego(codigo);
        
            ListIterator<Cliente> it = listaC.listIterator();
            if (!listaC.isEmpty()) {
                while (it.hasNext()) {
                    Cliente c = it.next();
                    DataPerfil dp = new DataPerfil(c.getNick(), c.getEmail(), "[CLIENTE]", 
                                        c.getNombre(), c.getApellido(), c.getFNac(), c.getEdad(),
                                        c.getImagen(), null);
                    listaDP.add(dp);
                }

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return listaDP;

    }

    @Override
    public List<DataJuego> listarJuegosAprobados() throws Exception{

        List<DataJuego> listaDj = new ArrayList(); //lista para retornar
        
        try{
            
            bdmcon.abrirConexion("public List<DataJuego> listarJuegosAprobados() throws Exception");
            
            List<Juego> listaJ = bdmj.obtenerJuegos();
            //lista de juegos obtenida desde el handler
            ListIterator<Juego> it = listaJ.listIterator(); //defino iterador 

            if (!listaJ.isEmpty()) {

                while (it.hasNext()) {

                    Juego j = it.next();
                    try {

                        if(bdmv.tieneAprobada(j.getCodigo())){
                            String path = FLMGUI.getProperty() + "/" + j.getImagen();
                            
                            String img64 = this.FLMGUI.obtenerBase64(path);
                            DataJuego datajuego = new DataJuego(j.getDesarrollador().getNombre(), j.getNombre(),
                                    j.getDescripcion(), j.getSize(), j.getCodigo(),
                                    j.getPrecio(), j.getNombresDeCategorias(), j.getImagen(), img64);
                            listaDj.add(datajuego);
                        }

                    } catch (Exception e) {
                        throw e;
                    }
                }

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return listaDj;
    }
    
    @Override
    public List<DataJuego> buscarJuegos(String texto) throws Exception{
    
        List<DataJuego> listaJ = new ArrayList(), listaAux = listarJuegosAprobados() ;
        
        if(listaAux.size() > 0){
        
            for (DataJuego dj : listaAux) {

                if(dj.getNombre().toLowerCase().indexOf(texto.toLowerCase()) >= 0 || 
                   dj.getDescripcion().toLowerCase().indexOf(texto.toLowerCase()) >= 0 ||
                   dj.getDesarrollador().toLowerCase().indexOf(texto.toLowerCase()) >= 0){
                
                    listaJ.add(dj);
                
                }else{
                
                    boolean esta = false;
                    Iterator it = dj.getCategorias().iterator();
                    while(!esta && it.hasNext()){
                    
                        String c = (String)it.next();
                        if(c.toLowerCase().indexOf(texto.toLowerCase()) >= 0){
                            esta = true;
                        }
                    
                    }
                    
                    if(esta){
                        listaJ.add(dj);
                    }
                }
            }
        }else{
        
            listaJ = null;
        
        }
        return listaJ;
    
    }
    
    //Auxiliar para ordenarJuegosXCompra
    public Integer obtenerJuegoMasComprado(List<DataJuego> lj)throws Exception{
    
        int imax = 0, max = 0;
        if(!lj.isEmpty()){
        
            for(int i=0; i <= lj.size() - 1; i++){
                
                DataJuego dj = lj.get(i);
                int cantCompras = getClientesCompranJuego(dj.getCodigo()).size();
                if(cantCompras > max){
                
                    imax = i;
                    max = cantCompras;
                
                }
                
            }
        
        }else{
        
            return -1;
        
        }
        
        return imax;
    
    };
    
    @Override
    public List<DataJuego> ordenarJuegosXCompras(List<DataJuego> lj)throws Exception{
    
        List<DataJuego> listAux = new ArrayList();
        
        if(!lj.isEmpty()){
        
            Iterator it = lj.iterator();
            while(it.hasNext()){
            
                int iMax = obtenerJuegoMasComprado(lj);
                listAux.add(lj.get(iMax));
                DataJuego remove = lj.remove(iMax);
                
            }
        
        }else{
        
            return null;
        
        }
        return listAux;
    
    }
    
    @Override
    public List<DataJuego> filtrarJuegos(List<DataJuego> lj, String filtro){
    
        List<DataJuego> listAux = new ArrayList();
        
        if(!lj.isEmpty()){
        
            switch (filtro){
            
                case "1": 
                    
                    for(DataJuego dj: lj){
                    
                        if(0 <= dj.getPrecio() && dj.getPrecio() <= 3){
                        
                            listAux.add(dj);
                        
                        }
                    
                    }
                    
                    break;
                    
                case "2":
                    
                    for(DataJuego dj: lj){
                    
                        if(3 <= dj.getPrecio() && dj.getPrecio() <= 10){
                        
                            listAux.add(dj);
                        
                        }
                    
                    }
                    
                    break;                   

                case "3":
                    
                    for(DataJuego dj: lj){
                    
                        if(10 < dj.getPrecio()){
                        
                            listAux.add(dj);
                        
                        }
                    
                    }
                    
                    break;
            
            }
        
        }else{
        
            return null;
        
        }
        
        return listAux;
        
    }
    
    @Override    
    public DataEstadistica obtenerEstadisticaPIE(String nickD) throws Exception{
    
        Estadistica es;
        DataEstadistica de = null;
        
        try{
            
            bdmcon.abrirConexion("public DataEstadistica obtenerEstadisticaPIE(String nickD) throws Exception");
            
            es = bdmp.obtenerEstadisticaPIE(nickD);
            de = (DataEstadistica)es.getData();
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return de;
        
    }
    
    @Override
    public List<DataJuego> getJuegosDesarrollador(String nick) throws Exception{
    
        List<DataJuego> listaDj = new ArrayList(); //lista para retornar
        
        try{
            
            bdmcon.abrirConexion("public List<DataJuego> getJuegosDesarrollador(String nick) throws Exception");
            
            List<Juego> listaJ = bdmj.getJuegosDesarrollador(nick);
            //lista de juegos obtenida desde el handler

            if (listaJ != null) {

                for(Juego j: listaJ){
                    try {

                        if(bdmv.tieneAprobada(j.getCodigo())){
                            String path = FLMGUI.getProperty() + "/" +j.getImagen();
                            String img64 = this.FLMGUI.obtenerBase64(path);
                            DataJuego dj = new DataJuego(j.getDesarrollador().getNombre(), j.getNombre(),
                                    j.getDescripcion(), j.getSize(), j.getCodigo(),
                                    j.getPrecio(), j.getNombresDeCategorias(), j.getImagen(), img64);
                            listaDj.add(dj);
                            
                        }

                    } catch (Exception e) {
                        throw e;
                    }
                }

            }else{
            
                return null;
            
            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return listaDj;   
    
    }
    
    @Override
    public DataEstadistica obtenerEstadisticaLINE(String nickD) throws Exception{

         Estadistica es;
         DataEstadistica de = null;

         try{

             bdmcon.abrirConexion("public DataEstadistica obtenerEstadisticaLine(String nickD) throws Exception");
             Integer mes = 0;
             List<DataCompra> listaC = bdmp.getComprasXDesarrollador(nickD);

             if(!listaC.isEmpty()){

                 es = new Estadistica(nickD);
                 inicializarDatosLineChart(es);
                 String mesString = null;
                 DecimalFormat df = new DecimalFormat("0.00"); 

                 for(DataCompra dc: listaC){

                     mes = Integer.parseInt(dc.getFecha().getMonth()) - 1;
                    switch(mes){

                        case 0: mesString= "ENE";break;
                        case 1: mesString= "FEB";break;
                        case 2: mesString= "MAR";break;
                        case 3: mesString= "ABR";break;
                        case 4: mesString= "MAY";break;
                        case 5: mesString= "JUN";break;
                        case 6: mesString= "JUL";break;    
                        case 7: mesString= "AGO";break;
                        case 8: mesString= "SET";break;
                        case 9: mesString= "OCT";break;    
                        case 10: mesString= "NOV";break;    
                        case 11: mesString= "DIC";break;    
                    }                     
                    Double suma = es.getDatosY().get(es.getDatosX().indexOf(mesString)) + dc.getPrecio();
                    String format = df.format(suma).replace(",", ".");
                     es.getDatosY().set(es.getDatosX().indexOf(mesString), Double.parseDouble(format));

                 }

                 de = (DataEstadistica)es.getData();

             }else{

                 return null;

             }

         }

         catch(Exception e){

             throw e;

         }

         finally{

             bdmcon.cerrarConexion();

         }

         return de;       

    }
    
    //Auxiliares
    public void cargarBD() throws Exception{
    
        try{
            
            bdmcon.abrirConexion("public void cargarBD() throws Exception");
            
            bdmcon.cargarBD();
            //FLMGUI.limpiarJuegos();
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }        
    
    }
    
    @Override
    public void inicializarDatosLineChart(Estadistica e) throws Exception{
    
        try{
            
            Integer meses = 12, mes = 0;
            
            GregorianCalendar fecha = new GregorianCalendar();
            mes = fecha.get(GregorianCalendar.MONTH);
        
            for(int i= 0; i <= meses - 1; i++){

                //SET DatosX
                switch(mes){

                    case 0: e.getDatosX().add("ENE");break;
                    case 1: e.getDatosX().add("FEB");break;
                    case 2: e.getDatosX().add("MAR");break;
                    case 3: e.getDatosX().add("ABR");break;
                    case 4: e.getDatosX().add("MAY");break;
                    case 5: e.getDatosX().add("JUN");break;
                    case 6: e.getDatosX().add("JUL");break;    
                    case 7: e.getDatosX().add("AGO");break;
                    case 8: e.getDatosX().add("SET");break;
                    case 9: e.getDatosX().add("OCT");break;    
                    case 10: e.getDatosX().add("NOV");break;    
                    case 11: e.getDatosX().add("DIC");break;    
                }
                //SET DatosY
                
                e.getDatosY().add(0.00);
                
                if(mes == 0){
                    mes = 11;
                }else{
                    mes = mes - 1;             
                }
            
            }
                    
            
        }
        
        catch(Exception ex){
        
            throw ex;
        
        }    
    }
    
 
    ////////////////////////////////////////////////////////////////////////////

    @Override
    public List<String> listarClientes() throws Exception{

        List<String> listaClientes = null;
        
        try{
            
            bdmcon.abrirConexion("public List<String> listarClientes() throws Exception");
            
            List<Cliente> clientes = this.bdmp.listarClientes();
            listaClientes = new ArrayList();
            int largo = clientes.size();
            for (int i = 0; i < largo; i++) {

                listaClientes.add(clientes.get(i).getNick());

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return listaClientes;

    }

    @Override
    public List<String> listarDesarrolladores() throws Exception{ //anda bien
        List<String> des = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<String> listarDesarrolladores() throws Exception");
            
            List<Desarrollador> desarrolladores = bdmp.listarDesarrolladores();
        
            if (!desarrolladores.isEmpty()) {
                Iterator<Desarrollador> it = desarrolladores.listIterator();
                while (it.hasNext()) {

                    Desarrollador d = it.next();
                    des.add(d.getNick());

                }
            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

        return des;

    }

    @Override
    public Integer altaDeJuegoWeb(DataJuego juego, byte[] imagen, String nombre_imagen) throws Exception{ //diego
        
        Integer identificador = 0;
        Boolean agrego = false;
        
        try{
            
            bdmcon.abrirConexion("public Integer altaDeJuegoWeb(DataJuego juego, byte[] imagen, String nombre_imagen) throws Exception");
            
            if (!bdmj.existeJuego(juego.getNombre())) {
                
                
                List<Categoria> cats = new ArrayList();
                List<String> listado_categorias = juego.getCategorias();
                int largo = listado_categorias.size();

                for (int i = 0; i < largo; i++) {

                    Categoria ca = bdmj.buscarCategoria(listado_categorias.get(i)); //busco la categoria y la agrego a la coleccion
                    cats.add(ca);

                }

                Desarrollador desarrollador = bdmp.buscarDesarrollador(juego.getDesarrollador()); //busco desarrollador
                Juego j = new Juego(desarrollador, juego.getNombre(), juego.getDescripcion(), //construyo y seteo la coleccion
                        juego.getSize(), juego.getPrecio(), juego.getImagen());
                if (desarrollador != null && !cats.isEmpty()) {
                    j.setCategorias(cats);
                    this.bdmj.agregarJuego(j);
                    Juego juego_creado = this.bdmj.buscarJuego(j.getNombre());
                    if (juego_creado != null) {

                        identificador = juego_creado.getCodigo();
                        agrego = true;

                    }
                }
                //creamos los archivos
                if(agrego && identificador > 0){
                    
                    String nomJuego = j.getNombre().toString();
                    String pathBD = FLMServidor.pathImagen(nomJuego, nombre_imagen);
                    FLMServidor.crearCarpetasJuego(nomJuego);
                    FLMServidor.crearImagenJuego(imagen, nombre_imagen, nomJuego);
                    
                    bdmcon.cerrarConexion();
                    
                    this.insertarImagen(identificador, pathBD);
                    
                }
            }
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return identificador; //si es 0 ---> error
    }
    
    @Override
    public Integer altaDeJuego(DataJuego juego) throws Exception{
        
        Integer identificador = 0;
        
        try{
            
            bdmcon.abrirConexion("public Integer altaDeJuego(DataJuego juego) throws Exception");
            
            if (!bdmj.existeJuego(juego.getNombre())) {

                List<Categoria> cats = new ArrayList();
                List<String> listado_categorias = juego.getCategorias();
                int largo = listado_categorias.size();

                for (int i = 0; i < largo; i++) {

                    Categoria ca = bdmj.buscarCategoria(listado_categorias.get(i)); //busco la categoria y la agrego a la coleccion
                    cats.add(ca);

                }

                Desarrollador desarrollador = bdmp.buscarDesarrollador(juego.getDesarrollador()); //busco desarrollador
                Juego j = new Juego(desarrollador, juego.getNombre(), juego.getDescripcion(), //construyo y seteo la coleccion
                        juego.getSize(), juego.getPrecio(), juego.getImagen());
                if (desarrollador != null && !cats.isEmpty()) {
                    j.setCategorias(cats);
                    this.bdmj.agregarJuego(j);
                    Juego juego_creado = this.bdmj.buscarJuego(j.getNombre());
                    if (this.bdmj.existeJuego(j.getNombre())) {

                        identificador = juego_creado.getCodigo();

                    }
                }
            }
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return identificador; //si es 0 ---> error
    }

    @Override
    public List<DataJuego> listarJuegos() throws Exception{

        List<DataJuego> listaDj = new ArrayList(); //lista para retornar
        
        try{
            
            bdmcon.abrirConexion("public List<DataJuego> listarJuegos() throws Exception");
            
            List<Juego> listaJ = bdmj.obtenerJuegos();
            //lista de juegos obtenida desde el handler
            ListIterator<Juego> it = listaJ.listIterator(); //defino iterador 
            if (!listaJ.isEmpty()) {
                while (it.hasNext()) {
                    Juego j = it.next();
                    String path = FLMGUI.getProperty() + "/" + j.getImagen();
                    String img64 = this.FLMGUI.obtenerBase64(path);
                    DataJuego datajuego = new DataJuego(j.getDesarrollador().getNombre(), j.getNombre(),
                              j.getDescripcion(), j.getSize(), j.getCodigo(),
                              j.getPrecio(), j.getNombresDeCategorias(), j.getImagen(), img64);
                    listaDj.add(datajuego);

                }

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return listaDj;
    }

    @Override
    public void registrarCompra(DataCompra dCompra) throws Exception{

        try{
            
            bdmcon.abrirConexion("public void registrarCompra(DataCompra dCompra) throws Exception");
            
            Cliente c = bdmp.buscarCliente(dCompra.getCliente());
            Juego j = bdmj.buscarJuego(dCompra.getJuego());
            Compra compra = new Compra(dCompra.getFecha(), c, j);
            bdmp.agregarCompra(compra);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

    }

    @Override
    public Integer ingresarCategoria(String categoria) throws Exception {

        Integer numero = -1;
        
        try{
        
            bdmcon.abrirConexion("public Integer ingresarCategoria(String categoria) throws Exception");
            
            if (!this.bdmj.existeCategoria(categoria)) {

                Categoria c = new Categoria(categoria);
                bdmj.agregarCategoria(c);
                
                numero = 1;

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

        return numero;


    }

    @Override
    public void limpiarBD() throws Exception {
    
        try{
            
            bdmcon.abrirConexion("public void limpiarBD() throws Exception");
            
            bdmcon.limpiarBD();
            FLMGUI.limpiarJuegos();
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
    }

    @Override
    public List<String> listarNomClientes()throws Exception{
    
        List<String> lnc = null;
        
        try{
            
            bdmcon.abrirConexion("public List<String> listarNomClientes()throws Exception");
            
            List<Cliente> listac = bdmp.listarClientes();
        
            Iterator<Cliente> itc = listac.iterator();
            lnc = new ArrayList();

            while(itc.hasNext()){

                Cliente c = itc.next();
                lnc.add(c.getNick());

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
    
        return lnc;
        
    }
    
    /*Alta Version*/
    //Pre: todos los juegos deben tener al menos una version, sino usar la de abajo
    @Override
    public List<DataJuegoVersion> listarJuegosxVersion() throws Exception{
    	
    	List<DataJuegoVersion> lista = new ArrayList();
    	
        try{
            
            bdmcon.abrirConexion("public List<DataJuegoVersion> listarJuegosxVersion() throws Exception");
            
            List<Juego> listajuegos = this.bdmj.obtenerJuegos();
           	
            Iterator<Juego> it = listajuegos.iterator();
            while(it.hasNext()){

                    Juego j = it.next();
                    List<Version> versiones = bdmv.obtenerVersionesxJuego(j.getCodigo());
                    List<String> versionesAprobadas = new ArrayList();

                    if(versiones.size() > 0){
                            Iterator<Version> itt = versiones.iterator();
                            while(itt.hasNext()){

                                    Version v = itt.next();
                                    if(v instanceof Aprobada){

                                            versionesAprobadas.add(v.getNumero().toString());

                                    }

                            }

                    }

                    DataJuegoVersion djv = new DataJuegoVersion(j.getNombre(), versionesAprobadas);
                    lista.add(djv);


            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
    	
    	return lista;
    
    }
    
    @Override
    public List<DataJuegoVersion> listarJuegosVersiones() throws Exception{
        
        List<DataJuegoVersion> lista = null;
        
        try{
            
            bdmcon.abrirConexion("public List<DataJuegoVersion> listarJuegosVersiones() throws Exception");
            
            lista = this.bdmj.listJuegoVersion();
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return lista;
        
    }
    
    @Override
    public void altaVersion(Double numVersion, String nombreJuego, Double tamanio, String archivo) throws Exception{
    	
    	try{
            
            bdmcon.abrirConexion("public void altaVersion(Double numVersion, String nombreJuego, Double tamanio, String archivo) throws Exception");
            
            Juego j = this.bdmj.buscarJuego(nombreJuego);
        	
            if(j!=null){

                Integer codigo_juego = j.getCodigo();
                if(bdmv.existePendiente(codigo_juego)){

                    throw new Exception("Este juego ya tiene una versión pendiente de aprobación.");                

                }
                else{

                    Double version_maxima = bdmv.versionMayorAprobada(codigo_juego);

                    if(version_maxima >= numVersion  ){

                        throw new Exception("Ya hay una versión más reciente.");

                    }
                    else{

                        PDate fecha = this.bdmv.crearFechaActual();              
                        Pendiente p = new Pendiente(numVersion, fecha,  j,  tamanio, archivo);
                        this.bdmv.agregarPendiente(p);

                    }
                }

            }
            else{

                throw new Exception("No se encontro el juego.");

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        

    }
    
    @Override
    public void altaVersion(Double numVersion, Integer codigo_juego, Double tamanio, String archivo) throws Exception{
    	
    	try{
            
            bdmcon.abrirConexion("public void altaVersion(Double numVersion, Integer codigo_juego, Double tamanio, String archivo) throws Exception");
            
            Juego j = this.bdmj.buscarJuegoxCodigo(codigo_juego);
        	
            if(j!=null){

                if(bdmv.existePendiente(codigo_juego)){

                    throw new Exception("Esta version ya tiene una version pendiente de aprobacion.");                

                }
                else{

                    Double version_maxima = bdmv.versionMayorAprobada(codigo_juego);

                    if(version_maxima >= numVersion  ){

                        throw new Exception("Ya hay una version mas reciente.");

                    }
                    else{

                        PDate fecha = this.bdmv.crearFechaActual();              
                        Pendiente p = new Pendiente(numVersion, fecha,  j,  tamanio, archivo);
                        this.bdmv.agregarPendiente(p);

                    }
                }

            }
            else{

                throw new Exception("No se encontro el juego.");

            }

        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
    }
        
    @Override
    public void altaVersionWeb(byte[] version, Double numVersion, Integer codigo_juego, String nombre_archivo) throws Exception{
    	
        try{
        
            bdmcon.abrirConexion("public void altaVersionWeb(byte[] version, Double numVersion, Integer codigo_juego, String nombre_archivo) throws Exception");
            
            Double tamanio;
            String archivo;

            Juego j = this.bdmj.buscarJuegoxCodigo(codigo_juego);	


            if(j!=null){
                String nombre_juego = j.getNombre();            
                if(bdmv.existePendiente(codigo_juego)){

                    throw new Exception("Esta version ya tiene una version pendiente de aprobacion.");                

                }
                else{

                    Double version_maxima = bdmv.versionMayorAprobada(codigo_juego);

                    if(version_maxima >= numVersion  ){

                        throw new Exception("Ya hay una version mas reciente.");

                    }
                    else{

                        String numero_version = numVersion.toString();
                        DataVersion dTemp = FLMServidor.crearPendiente(version, nombre_juego, numero_version, nombre_archivo);

                        PDate fecha = this.bdmv.crearFechaActual();      
                        tamanio = dTemp.getTamanio();
                        archivo = dTemp.getArchivo();
                        Pendiente p = new Pendiente(numVersion, fecha,  j,  tamanio, archivo);
                        this.bdmv.agregarPendiente(p);

                    }
                }

            }
            else{

                throw new Exception("No se encontro el juego.");

            }

        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }

    }
    
    @Override
    public List<DataVersion> listarPendientes() throws Exception{
    	
        List<DataVersion> lista = new ArrayList();
    	
        try{
        
            bdmcon.abrirConexion("public List<DataVersion> listarPendientes() throws Exception");
            
            List<Pendiente> pendientes = this.bdmv.listarPendientes();
            Iterator<Pendiente> it = pendientes.iterator();

            while(it.hasNext()){


                    Pendiente p = it.next();
                    DataVersion dv = p.getDataVersion();
                    lista.add(dv);

            }
    	
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
    	return lista;
        
    }
    
    @Override
    public void altaAprobada(DataVersion dv) throws Exception{
    	
        try{
            
            bdmcon.abrirConexion("public void altaAprobada(DataVersion dv) throws Exception");
            
            String nombre_juego = dv.getNombreJuego();
            String path = FLMGUI.getProperty() + "/" + dv.getArchivo();
            FLMGUI.movetoAprobada(path, nombre_juego);
            String[] path_file = path.split(FLMGUI.getProperty()+"/");
            String[] nombre_file = path_file[1].split("pendientes/");
            dv.setArchivo("Data/Juegos/"+nombre_juego+"/versiones/aprobadas/"+nombre_file[1]);
            this.bdmv.addAprobada(dv);
            bdmj.actualizarTamanio( dv.getCodigoJuego(), dv.getTamanio());

            
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
    }
    
    @Override
    public void altaRechazada(DataVersion dv, String motivo) throws Exception{
            
        try{
            
            bdmcon.abrirConexion("public void altaRechazada(DataVersion dv, String motivo) throws Exception");
            String path = FLMGUI.getProperty() + "/" + dv.getArchivo();
            this.FLMGUI.movetoRechazada(path , dv.getNombreJuego());
         
            this.bdmv.addRechazada(dv, motivo);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
    }
    
    @Override
    public List<DataJuegoVersion> listarJuegosVersiones(String nickDesarrollador) throws Exception{
        
        List<DataJuegoVersion> lista = null;
        
        try{
            
            bdmcon.abrirConexion("public List<DataJuegoVersion> listarJuegosVersiones(String nickDesarrollador) throws Exception");
            
            lista = this.bdmj.listJuegoVersion(nickDesarrollador);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return lista;
        
    }
    
    @Override
    public List<DataVersion> listarAprobadas(String juego) throws Exception{
        
        List<DataVersion> lista = new ArrayList();
        
        try{
            
            bdmcon.abrirConexion("public List<DataVersion> listarAprobadas(String juego) throws Exception");
            
            List<Aprobada> aprobadas = this.bdmv.listarAprobadas();
        
            for(Aprobada a : aprobadas){

                if(a.getJuego().getNombre().equals(juego)){

                    DataVersion dv = a.getDataVersion();
                    lista.add(dv);
                }

            }
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
                
        return lista;
        
    }
    
    @Override
    public DataVersion obtenerUltimaVersion (Integer codigo_juego) throws Exception{
        
        DataVersion v = null;
        
        try{
            
            bdmcon.abrirConexion("public DataVersion obtenerUltimaVersion (Integer codigo_juego) throws Exception");
            
            Aprobada a = this.bdmv.buscarUltimaAprobada(codigo_juego);
        
            v = a.getDataVersion();        
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
        return v;
    
    }
    
    @Override
    public DataVersionDesarrollador listarVersionesDesarrollador(String desarrollador) throws Exception{
        
        DataVersionDesarrollador dvd = null;
        
        try{
            
            bdmcon.abrirConexion("public DataVersionDesarrollador listarVersionesDesarrollador(String desarrollador) throws Exception");
            
            List<Rechazada> re = this.bdmv.listarRechazadas();
             
            List<Aprobada> ap = this.bdmv.listarAprobadas();
            List<Pendiente> pe = this.bdmv.listarPendientes();


            List<DataVersion> aprobadas = new ArrayList();
            List<DataVersion> rechazadas = new ArrayList();
            List<DataVersion> pendientes = new ArrayList();


            for(Rechazada r : re){

                if(r.getJuego().getDesarrollador().getNick().equals(desarrollador)){

                    rechazadas.add(r.getDataVersion());

                }

            }
            for(Aprobada a : ap){


                if(a.getJuego().getDesarrollador().getNick().equals(desarrollador)){

                    aprobadas.add(a.getDataVersion());

                }

            }
            for(Pendiente p : pe){

                if(p.getJuego().getDesarrollador().getNick().equals(desarrollador)){

                    pendientes.add(p.getDataVersion());

                }

            }

            dvd = new DataVersionDesarrollador(desarrollador, aprobadas, rechazadas, pendientes);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return dvd;
    }
    
    @Override
    public List<String> listarJuegosComprados(String nick_cliente) throws Exception{
        
        List<String> lista = null;
        
        try{
            
            bdmcon.abrirConexion("public List<String> listarJuegosComprados(String nick_cliente) throws Exception");
            
            lista = this.bdmp.juegosCompradosxCliente(nick_cliente);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return lista;
        
    }
    
    @Override
    public Boolean tieneAprobada(Integer codigo_juego) throws Exception{
        
        Boolean existe = null;
        
        try{
            
            bdmcon.abrirConexion("public Boolean tieneAprobada(Integer codigo_juego) throws Exception");
            
            existe = bdmv.tieneAprobada(codigo_juego);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return existe;
    
    }
    
    @Override
    public List<DataJuego> obtenerJuegosPopulares() throws Exception{
        
        List<DataJuego> lista = null;
        
        try{
            
            bdmcon.abrirConexion("public List<DataJuego> obtenerJuegosPopulares() throws Exception");
            
            lista = this.bdmj.obtenerJuegosPopulares();
            for(DataJuego dj : lista){
                
                String path = FLMGUI.getProperty() + "/" + dj.getImagen();
                String img64 = this.FLMGUI.obtenerBase64(path);
                dj.setCodeImagen(img64);
            }
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return lista;
        
    }
    
    @Override
    public Boolean existeJuego(String nombre_juego)throws Exception{
     
        Boolean existe = null;
        
        try{
        
            bdmcon.abrirConexion("public Boolean existeJuego(String nombre_juego)throws Exception");
            
            existe = this.bdmj.existeJuego(nombre_juego);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return existe;
            
    }    
       
    @Override
    public Boolean clienteComproJuego(String nick_cliente, Integer codigo_juego) throws Exception{
    
        Boolean compro = null;
        
        try{
            
            bdmcon.abrirConexion("public Boolean clienteComproJuego(String nick_cliente, Integer codigo_juego) throws Exception");
            
            compro = bdmp.clienteComproJuego(nick_cliente, codigo_juego);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return compro;
         
    }
   
    public void cargarVersiones(DatosDePrueba dp) throws Exception{
        
        /*VERSIONES*/
         
         List<DataVersion> DV= dp.getDVersion();
         for(DataVersion dv : DV){
             String nomjuego = dv.getNombreJuego();
             String pathArchivo = "Data/Juegos/"+nomjuego+"/versiones/pendientes/10.jar";
             dv.setArchivo(pathArchivo);
             this.altaVersion(dv.getVersion(), dv.getNombreJuego(), dv.getTamanio(), dv.getArchivo());

         }
         int largo = DV.size() - 3;
         for(int i = 0; i<largo; i++){
             
             DataVersion dv2 = DV.get(i);
             this.altaAprobada(dv2);

         }
         
        
    }
    
    @Override
    public void insertarImagen(Integer codigo_juego , String path) throws Exception{
        
        try{
            
            bdmcon.abrirConexion("public void insertarImagen(Integer codigo_juego , String path) throws Exception");
            
            this.bdmj.agregarImagen(codigo_juego, path);
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
    }
    
    @Override
    public void bajaDeJuego(String  juego) throws Exception{
        
        try{
            
            bdmcon.abrirConexion("public void bajaDeJuego(String  juego) throws Exception");
            
            Juego j = this.bdmj.buscarJuego(juego);
            
            bdmcon.cerrarConexion();
            if(j != null){
                
                Integer codigo_juego = j.getCodigo();
                
                List<DataComentario> comentarios = listarComentarios(juego);
                bdmcon.abrirConexion("public void bajaDeJuego(String  juego) throws Exception");
                this.bdmp.eliminarReclamosJuego(codigo_juego);
                this.bdmj.bajaDeJuego(codigo_juego, comentarios);
                FLMGUI.borrarDirectorio(FLMGUI.getProperty()+"/Data/Juegos/"+j.getNombre());

            }
            else{

                throw new Exception("Juego no encontrado!");

            }            
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
            
    }
    
    @Override
    public void ingresarRegistro(String ip, String navegador, String url) throws Exception{
        
        try{
            
            bdmcon.abrirConexion("public void ingresarRegistro(String ip, String navegador, String url) throws Exception");
            
            PDate fecha = bdmv.crearFechaActual();
        
            Registro R = new Registro(ip, navegador, fecha, url);

            bdmp.ingresarRegistro(R);
            
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
    
    }
    
    @Override
    public List<DataRegistro> listarRegistros() throws Exception{
        
        List<DataRegistro> registros = new ArrayList();
        
        try{
        
            bdmcon.abrirConexion("public List<DataRegistro> listarRegistros() throws Exception");
            
            registros = bdmp.listarRegistros();
        
        }
        
        catch(Exception e){
        
            throw e;
        
        }
        
        finally{
        
            bdmcon.cerrarConexion();
        
        }
        
        return registros;
    }
    
    @Override
    public void notificarClientes(Integer codigo_juego, Double numero_version) throws Exception{
        
        try{
        
            List<DataPerfil> clientes = getClientesCompranJuego(codigo_juego);
            if(clientes.size() > 0){
                
                List<String> lista_clientes = new ArrayList();
                for(DataPerfil dp : clientes){

                    String nom = dp.getNick();
                    lista_clientes.add(nom);

                }
                
                Notificacion n = new Notificacion(codigo_juego, lista_clientes, numero_version);
                bdmcon.abrirConexion("public void ingresarRegistro(public void notificarClientes(Integer codigo_juego, Double numero_version) throws Exception{");
                this.bdmv.notificarClientes(n);
                bdmcon.cerrarConexion();
                
            }
            
        }
        catch(Exception e){
            
            throw e;
            
        }
              
    }
    
    @Override
    public void notificarCliente(String nick_cliente, Integer codigo_juego) throws Exception{
        try{
            
            bdmcon.abrirConexion("public void notificarCliente(String nick_cliente) throws Exception{");
            this.bdmp.notificarCliente(nick_cliente, codigo_juego);
        
        }
        catch(Exception e ){
            
            throw e;
            
        }
        
        finally{bdmcon.cerrarConexion();}
        
    }
        
    @Override
    public List<DataNotificacion> obtenerNotificacionesNuevas(String nick_cliente) throws Exception{
        List<DataNotificacion> lista = new ArrayList();
        try{
            
            bdmcon.abrirConexion("public List<DataNotificacion> obtenerNotificacionesNuevas(String nick_cliente) throws Exception");
            lista = this.bdmp.listarNotificacionesNuevas(nick_cliente);
       
        }
        catch(Exception e){
            throw e;
        }
        finally{ bdmcon.cerrarConexion();}
       
        return lista;
        
    }
    
    @Override 
    public void borrarNotificacion(Integer id) throws Exception{
        try{
            
            bdmcon.abrirConexion("public void borrarNotificacion() throws Exception");
            this.bdmp.borrarNotificacion(id);
        
        }
        catch(Exception e){ 
            
            throw e;
            
        }
        finally{bdmcon.cerrarConexion();}
        
    }
    
    @Override
    public List<String> getArchivoDeJuego(Integer codigo_juego) throws Exception{
        
        List<String> archivo_nombre = new ArrayList();
        try{
            
            bdmcon.abrirConexion("public List<String> getArchivoDeJuego(Integer codigo_juego) throws Exception{");
            Aprobada a = bdmv.buscarUltimaAprobada(codigo_juego);
            if(a != null){
                
                String path = a.getArchivo();
                File archivo = new File(System.getProperty("user.dir") + File.separatorChar + path); // groso pa uindous :d
                Archivo ar = new Archivo(archivo);
                String stringArchivo = (Base64.encodeBytes(ar.toBytes()));
                archivo_nombre.add(stringArchivo);
                archivo_nombre.add(ar.getNombreArchivo());
                
            }
            else{
                
                throw new Exception("No se ha encontrado la version");
                
            }
            
            
        }
        catch(Exception e){
            
            throw e;
            
        }
        finally{bdmcon.cerrarConexion();}
       
        return archivo_nombre;
        
    }
    
   
}
